package coder.common;

import lombok.Data;
@Data
public class Result<T> {
    private static final Integer SUCCESS_CODE = 1;
    private static final Integer FAIL_CODE = 0;
    private static final Integer NOT_FOUND_CODE = 404;
    private static final Integer UNAUTHORIZED_CODE= 401;
    private Integer code;
    private String msg;
    private T data;
    private String status;

    /**
     * 创建一个表示成功结果的Result对象
     * 此方法用于封装一个成功的结果，包括成功数据、成功消息和成功代码
     *
     * @param <T> 泛型参数，表示可以封装任意类型的成功数据
     * @param object 成功的数据对象，可以是任意类型
     * @return 返回一个封装了成功数据、成功消息和成功代码的Result对象
     */
    public static <T> Result<T> success(T object) {
        // 创建一个Result对象，用于封装结果数据
        Result<T> result = new Result<T>();
        // 设置成功数据
        result.data = object;
        // 设置成功消息
        result.msg = "操作成功";

        result.status = "success";
        // 设置成功代码
        result.code = SUCCESS_CODE;
        // 返回封装好的Result对象
        return result;
    }

    /**
     * 创建一个表示成功结果的对象
     *
     * 此方法用于生成一个通用的 success 结果对象，该对象可以用于各种场景，以表示操作成功
     * 它不包含任何数据，仅包含表示成功的状态码和消息
     *
     * @param <T> 表示结果对象中数据的类型，由于数据为空，所以这里 T 为泛型标记
     * @return 返回一个表示成功的 Result 对象，包含成功状态码和默认的成功消息
     */
    public static <T> Result<T> success() {
        Result<T> result = new Result<T>();
        result.msg = "操作成功";
        result.code = SUCCESS_CODE;
        result.status = "success";
        return result;
    }

    /**
     * 创建一个错误的响应结果对象
     * 该方法用于当操作失败时，返回一个携带错误信息的Result对象
     *
     * @param msg 错误信息，用于告知调用者失败的原因
     * @return 返回一个错误的Result对象，包含错误信息和失败的状态码
     */
    public static <T> Result<T> error(String msg) {
        // 创建一个Result对象实例，用于封装操作结果
        Result<T> result = new Result<T>();
        // 设置错误信息
        result.msg = msg;
        result.status = "error";
        // 设置失败状态码
        result.code = FAIL_CODE;
        // 返回封装了错误信息和状态码的Result对象
        return result;
    }

    public static <T> Result<T> notFound(String msg) {
        Result<T> result = new Result<T>();
        result.msg = msg;
        result.code = NOT_FOUND_CODE;
        result.status = "not_found";
        return result;
    }

    public static <T> Result<T> unauthorized(String msg) {
        Result<T> result = new Result<T>();
        result.msg = msg;
        result.code = UNAUTHORIZED_CODE;
        result.status = "unauthorized";
        return result;
    }
}
